【2019年12月】Scala 3(Dotty)開発の進捗と2.13からの移行についての最新情報
[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
2019年12月18日に、スイス連邦工科大学ローザンヌ校(通称EPFL)のScala 3開発チームより、Scala 2系開発における今後のロードマップと3系の開発作業の進捗についてアナウンスがありました。
記事全体としては、Scala 3の開発が順調に進んでいる旨の内容です。つまりは朗報ですね。
詳しくは当該記事を読んで頂くとして、本記事ではその要旨を説明します。
Scala3は2020年内のリリースを目指す。Scala 2.13とバイナリ互換になる予定。
RC版を2020年末にリリースできるよう進めています。
予定に変更があればまた告知するとのこと。
Scala 2.14は不要になったので開発中止。Scala 3の開発に全力集中する。
以前のロードマップでは、Scala 3はScala 2系との間に大きな差が生じることが予想されていました。
大きな差が生じるとPython 2から3への移行時のように、古い系列がいつまでも淘汰されず、ユーザーが混乱してしまうことが懸念されていました。
このような事態を防ぐため、2系と3.0との差を小さくしてユーザーの移行をスムーズなものとするよう、Scala 2.14が開発される予定でした。
しかし、Scala 2.13において既にある程度の移行措置がとられました。
したがって、すでにScala 3との差分が小さくなってきていることから、Scala 2.14は不要であると判断できたわけです。
予期せぬ事情がない限り、この方針は変わりません。
Scala 2.14の開発に割くリソースをScala 3の開発に振り向けられるので、Scala 3の開発が加速される見込みです。
Scala 3.0は2020年末までのリリースを見込んでいる。
以前のロードマップでも2020年頃のリリースと言われていましたが、
ある程度その見込み通りに進んでいることが明らかになったわけですね。
ただしこれはRC版です。正式版については言及されていません。
Scala 3.0の標準ライブラリは、Scala 2.13の標準ライブラリと共通。
移行をスムーズにするため、標準ライブラリは Scala 2.13 と 3 とで共通になります。
つまり新しいメソッドが追加されたり、何らかのメソッドが削除されたりといったことはありません。
その代わり、3系のどこかのタイミングでバイナリ非互換な変更が入る予定です。
したがって両者はバイナリ互換となるので、移行がより手軽になる。
Scala 3.0の標準ライブラリは、Scala 2.13の標準ライブラリと共通になります。
バイナリ非互換な変更はScala 4系へと先送りとすることにより、Scala 3系への移行作業が容易になりました。
ライブラリ開発者にとっては、ライブラリ本体を3系へアップデートしつつも、ユーザーに対しては2.13を使い続ける選択肢を残している点が嬉しいことでしょう。
技術的な互換性を担保したことにに加えて、さらに円滑な移行となるようテストやツールにも投資していく予定です。
Q&A
以下は記事後半のQ&Aの要旨です。
Scala 3.0のリリースはいつ?:RC版が2020年末(見込み)
最初のRC版が2020年末にリリースされる見込みです。
RCがいつ取れるのかについては明言されていません。
標準ライブラリはどうなるの?
- Scala 3.0の標準ライブラリは2.13のと共通で、バイナリ互換になる。
- Scala 3.0の生成物と2.13の生成物はクラスパスに共存できる。
- Scala 2.13の標準ライブラリは前方互換・後方互換ともにある。
- もしかしたら何かしらの改善があるかもしれないが、バイナリ互換は維持する。
- 3系のいずれかのバージョンにて3系独自の標準ライブラリがリリースされる予定。
- その点では、Scala 3系の標準ライブラリに前方互換はなく、後方互換のみがあるといえる。
- 2系の標準ライブラリの機能拡張が3系で行われる可能性があり、この変更については3系でしか通用しないことになる。
- (このような変更を2系本体にバックポートする可能性については優先度が低いとしている)
- 標準ライブラリに対する意味的あるいは構造的な変更は4系に延期する。ただ、それはそう遠くない見込み。
- 後方互換性のないメジャーリリースを今後頻繁に行なっていく予定。
Scala 3におけるバイナリ互換の扱いはどのような感じ?
- 3系より、TASTyという仕組みを導入した。
- TASTyにより、バイナリ互換でなくとも「ソース互換であれば互換性がある」といえるようになった。
- ただし完全ではない。APIの破壊的変更には対応できない。これはリファクタリングするしかない。
- TASTyには後方互換があるため、ライブラリのメンテナはScalaのマイナーリリースが出たからといってアップデートをリリースする必要はない。
- 例えば、3.2用のライブラリを3.4用に再度コンパイルして出し直す必要はない。
2.13のマクロは?
- 3では書けません!
- 3系用のマクロシステムを出す予定。
- つまり2系から3系への書き換えが必要。
- 2系と3系のマクロ定義ファイルを別個に持ってクロスビルドすることは可能。
マクロ以外には非互換の変更はある?
- 2系にある大多数の機能はサポートされている。
- サポートされなくなったのは主に以下の機能。
- early initializers
- existential types
- weak conformance
- DelayedInit
- 詳しくはこちら
性能はどう?
- コンパイル速度
- 顕著なデグレが生じていないかどうか、継続的にモニタリングをしている
- 2.13と3との比較についてはまだ「準備中」
- 実行速度
- 変わりません。
- バイナリ互換なので。
- 変わりません。
- パフォーマンス関連機能
- いくつか実装される。
- 将来のリリースで導入見込みの機能もある。
- いくつか実装される。
各種ツールの対応状況は?
ビルドツール、互換性チェッカー、IDE、シンタックス整形ツールなどの重要なツール類はScala 3と同時にリリースする予定。
Python 2から3への移行時のような混乱は生じないよね?
はい。心配無用!
何かしら貢献したいのだけど、どうすればいい?
- 今がベストなタイミング。
- エコシステム(ライブラリ等)の移行作業を手伝ってあげる。
- あるいは、Scala本体の開発に参加してみる。
おわりに
全体の要旨としては「2.14は開発中止」「3.0に集中」「開発が加速」とのことでした。
「2.14で予定していたものが3.0に繰り下がって、3.0で予定していたものがそれ以降に繰り下がった」ように見えなくもありませんが、
そもそもの話、スコープを区切ってゴールを見直すのはいいことです。
それよりもむしろ、3.0で目指していたことが実現される目処が立ったこと、
Scala 2.13から3.0やそれ以降へのバージョンアップを漸進的に行うことができる道筋が付いたことが嬉しいですね。
Scala 3.0が2020年中に無事リリースされるのを楽しみに待ちましょう。